import os
import sys
import logging
from logging.handlers import RotatingFileHandler

def get_log_dir():
    """获取日志目录，开发模式下使用用户目录"""
    # 默认使用开发模式
    if os.getenv('FLASK_ENV') != 'production':
        # 开发模式：使用用户目录
        log_dir = os.path.expanduser('~/camera-pi/logs')
    else:
        # 生产模式：使用系统目录
        log_dir = '/var/log/camera-pi'
    
    try:
        if not os.path.exists(log_dir):
            os.makedirs(log_dir, mode=0o755)
        # 测试目录是否可写
        test_file = os.path.join(log_dir, '.test')
        with open(test_file, 'w') as f:
            f.write('test')
        os.remove(test_file)
        return log_dir
    except (PermissionError, OSError) as e:
        # 如果无法写入系统目录，回退到用户目录
        fallback_dir = os.path.expanduser('~/camera-pi/logs')
        if not os.path.exists(fallback_dir):
            os.makedirs(fallback_dir, mode=0o755)
        return fallback_dir

def setup_logger():
    """配置日志系统"""
    try:
        log_dir = get_log_dir()
        logger = logging.getLogger()

        # 配置日志处理器
        file_handler = RotatingFileHandler(
            os.path.join(log_dir, 'camera-pi.log'),
            maxBytes=10*1024*1024,  # 10MB
            backupCount=5
        )
        console_handler = logging.StreamHandler(sys.stdout)

        # 设置日志格式
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        file_handler.setFormatter(formatter)
        console_handler.setFormatter(formatter)

        # 配置根日志记录器
        logger.setLevel(logging.INFO)
        logger.addHandler(file_handler)
        logger.addHandler(console_handler)

        return logger
    except Exception as e:
        # 如果日志配置失败，至少确保有一个基本的控制台日志记录器
        logger = logging.getLogger()
        console_handler = logging.StreamHandler(sys.stdout)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        console_handler.setFormatter(formatter)
        logger.setLevel(logging.INFO)
        logger.addHandler(console_handler)
        logger.error(f"日志配置失败，使用控制台日志: {str(e)}")
        return logger 